package fragments.demo;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.widget.TextView;

public class CommunicateWithActivityActivity extends Activity implements TitleFragment.OnTitleSelectedListener {

	/**
	 * 为Activity创建事件回调方法的使用
	 * 
	 * 例如, 如果一个新的应用在activity中有2个fragment – 一个用来显示文章列表(Title Fragment), 另一个显示文章内容(Content Fragment) 
	 * 然后 Title Fragment必须告诉activity何时一个list item被选中,然后它可以告诉Content Fragment去显示文章.
	 * 
	 * 在这种情况下, 你可能需要一个fragment与activity分享事件. 一个好的方法是在fragment中定义一个回调的interface, 
	 * 并要求宿主activity实现它.当activity通过interface接收到一个回调, 必要时它可以和在layout中的其他fragment分享信息.
	 * 
	 * 在 Title Fragment(TitleFragment.java)中定义了一个回调的接口 OnTitleSelectedListener 并且在宿主Activity
	 * (CommunicateWithActivityActivity.java) 中实现了这个借口并且重写了onTitleSelected()方法. 来通知
	 * Content Fragment,从Title Fragment到来的事件.
	 * 
	 * 为了确保宿主Activity实现OnTitleSelectedListener借口，可以在Title Fragment的 onAttach()方法
	 * (当添加fragment到activity时由系统调用onAttach())中将作为参数传入onAttach()的Activity做类型转换来
	 * 实例化一个OnTitleSelectedListener实例. 如果activity没有实现接口, fragment会抛出 ClassCastException 
	 * 异常. 
	 * 
	 * 正常情形下, titleSelectedListener成员会持有一个到activity的OnTitleSelectedListener实现的引用, 因此
	 * Title Fragment可以通过调用在OnTitleSelectedListener接口中定义的方法分享事件给宿主activity.例如, 
	 * 如果Title Fragment是一个 ListFragment的子类, 每次用户点击一个列表项, 系统调用 在fragment中的
	 * onListItemClick(),然后后者调用 onArticleSelected() 来分配事件给activity.传给 onListItemClick() 的 id 
	 * 参数是被点击的项的行ID, activity(或其他fragment)用来从应用的 ContentProvider 获取文章.
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		//向Activity中添加 Fragment
		FragmentManager  fragmentManager = this.getFragmentManager();
		FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
		fragmentTransaction.add(R.id.titleFrame, new TitleFragment(), "titleFragment");
		fragmentTransaction.add(R.id.contentFrame, new ContentFragment(), "contentFragment");
		fragmentTransaction.commit();
		
		setContentView(R.layout.communicate_with_activity);
	}

	public void onTitleSelected(int position) {
		FragmentManager fragmentManager = this.getFragmentManager();
		Fragment fragment = (Fragment)fragmentManager.findFragmentByTag("contentFragment");
		
		TextView textViewContent = (TextView)fragment.getView().findViewById(R.id.textViewContent);
		textViewContent.setText("Position:" + position);
		
	}
}
